package br.org.ifrr.controller;

import java.awt.Image;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.enterprise.context.RequestScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.servlet.http.HttpServletResponse;
import javax.swing.ImageIcon;
import javax.validation.constraints.NotNull;

import org.hibernate.Session;

import br.org.ifrr.model.Gestor;
import br.org.ifrr.model.Grupo;
import br.org.ifrr.repository.Gestores;
import br.org.ifrr.repository.Grupos;
import br.org.ifrr.util.jsf.FacesUtil;
import br.org.ifrr.util.report.ExecutorRelatorio;


@Named
@RequestScoped
public class RelatorioGrupoBean implements Serializable {

	private static final long serialVersionUID = 1L;

	private Grupo grupoDescricao;

	@Inject
	private FacesContext facesContext;

	@Inject
	private HttpServletResponse response;

	@Inject
	private EntityManager manager;

	@Inject
	private Gestores gestores;
	
	@Inject
	private Grupos grupos;

	

	public void emitirGrupo() {
		
		Map<String, Object> parametros = new HashMap<>();
		
		Image logo = new ImageIcon(getClass().getResource("/resources/images/brasao.jpg")).getImage(); 
		parametros.put("logo", logo);
		
		parametros.put("grupo_descricao", this.grupoDescricao.getNomeGrupo());

		ExecutorRelatorio executor = new ExecutorRelatorio(
				"/relatorios/relatorio_grupo_bem.jasper", this.response,
				parametros, this.grupoDescricao.getNomeGrupo()+ " - "
						+ new SimpleDateFormat("dd/MM/yyyy").format(new Date()) +".pdf");

		Session session = manager.unwrap(Session.class);
		session.doWork(executor);

		if (executor.isRelatorioGerado()) {
			facesContext.responseComplete();
		} else {

			FacesUtil.addErrorMessage("A execução do relatório não retornou dados.");
		}

	}
	
		
	@NotNull
	public Grupo getGrupoDescricao() {
		return grupoDescricao;
	}

	public void setGrupoDescricao(Grupo grupoDescricao) {
		this.grupoDescricao = grupoDescricao;
	}

	public List<Gestor> completarSetor(String setor) {
		return this.gestores.porSetor(setor);
	}
	
	public List<Grupo> completarGrupoDescricao(String grupoDescricao) {
		return this.grupos.porGrupoDescricao(grupoDescricao);
	}

}